home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / system-config-printer / pysmb.py < prev    next >
Text File  |  2009-10-19  |  6KB  |  184 lines

  1. #!/usr/bin/python
  2.  
  3. ## system-config-printer
  4. ## CUPS backend
  5.  
  6. ## Copyright (C) 2002, 2003, 2006, 2007, 2008 Red Hat, Inc.
  7. ## Copyright (C) 2002, 2003, 2006, 2007, 2008 Tim Waugh <twaugh@redhat.com>
  8.  
  9. ## This program is free software; you can redistribute it and/or modify
  10. ## it under the terms of the GNU General Public License as published by
  11. ## the Free Software Foundation; either version 2 of the License, or
  12. ## (at your option) any later version.
  13.  
  14. ## This program is distributed in the hope that it will be useful,
  15. ## but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. ## GNU General Public License for more details.
  18.  
  19. ## You should have received a copy of the GNU General Public License
  20. ## along with this program; if not, write to the Free Software
  21. ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  22.  
  23. import errno
  24. from gettext import gettext as _
  25. import gobject
  26. import gtk
  27. import os
  28. import pwd
  29. import smbc
  30. from debug import *
  31.  
  32. class AuthContext:
  33.     def __init__ (self, parent=None, workgroup='', user='', passwd=''):
  34.         self.passes = 0
  35.         self.has_failed = False
  36.         self.auth_called = False
  37.         self.tried_guest = False
  38.         self.cancel = False
  39.         self.use_user = user
  40.         self.use_password = passwd
  41.         self.use_workgroup = workgroup
  42.         self.dialog_shown = False
  43.         self.parent = parent
  44.  
  45.     def perform_authentication (self):
  46.         self.passes += 1
  47.         if self.passes == 1:
  48.             return 1
  49.  
  50.         if not self.has_failed:
  51.             return 0
  52.  
  53.         debugprint ("pysmb: authentication pass: %d" % self.passes)
  54.         if not self.auth_called:
  55.             debugprint ("pysmb: auth callback not called?!")
  56.             self.cancel = True
  57.             return 0
  58.  
  59.         self.has_failed = False
  60.         if self.auth_called and not self.tried_guest:
  61.             self.use_user = 'guest'
  62.             self.use_password = ''
  63.             self.tried_guest = True
  64.             debugprint ("pysmb: try auth as guest")
  65.             return 1
  66.  
  67.         self.auth_called = False
  68.  
  69.         if self.dialog_shown:
  70.             d = gtk.MessageDialog (self.parent,
  71.                                    gtk.DIALOG_MODAL |
  72.                                    gtk.DIALOG_DESTROY_WITH_PARENT,
  73.                                    gtk.MESSAGE_ERROR,
  74.                                    gtk.BUTTONS_CLOSE)
  75.             d.set_title (_("Not authorized"))
  76.             d.set_markup ('<span weight="bold" size="larger">' +
  77.                           _("Not authorized") + '</span>\n\n' +
  78.                           _("The password may be incorrect."))
  79.             d.run ()
  80.             d.destroy ()
  81.  
  82.         # After that, prompt
  83.         d = gtk.Dialog ("Authentication", self.parent,
  84.                         gtk.DIALOG_MODAL | gtk.DIALOG_NO_SEPARATOR,
  85.                         (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
  86.                          gtk.STOCK_OK, gtk.RESPONSE_OK))
  87.         d.set_default_response (gtk.RESPONSE_OK)
  88.         d.set_border_width (6)
  89.         d.set_resizable (False)
  90.         hbox = gtk.HBox (False, 12)
  91.         hbox.set_border_width (6)
  92.         image = gtk.Image ()
  93.         image.set_from_stock (gtk.STOCK_DIALOG_AUTHENTICATION,
  94.                               gtk.ICON_SIZE_DIALOG)
  95.         hbox.pack_start (image, False, False, 0)
  96.         vbox = gtk.VBox (False, 12)
  97.         label = gtk.Label ('<span weight="bold" size="larger">' +
  98.                            "You must log in to access %s." % self.for_server +
  99.                            '</span>')
  100.         label.set_use_markup (True)
  101.         label.set_alignment (0, 0)
  102.         label.set_line_wrap (True)
  103.         vbox.pack_start (label, False, False, 0)
  104.  
  105.         table = gtk.Table (3, 2)
  106.         table.set_row_spacings (6)
  107.         table.set_col_spacings (6)
  108.         table.attach (gtk.Label ("Username:"), 0, 1, 0, 1, 0, 0)
  109.         username_entry = gtk.Entry ()
  110.         table.attach (username_entry, 1, 2, 0, 1, 0, 0)
  111.         table.attach (gtk.Label ("Domain:"), 0, 1, 1, 2, 0, 0)
  112.         domain_entry = gtk.Entry ()
  113.         table.attach (domain_entry, 1, 2, 1, 2, 0, 0)
  114.         table.attach (gtk.Label ("Password:"), 0, 1, 2, 3, 0, 0)
  115.         password_entry = gtk.Entry ()
  116.         password_entry.set_activates_default (True)
  117.         password_entry.set_visibility (False)
  118.         table.attach (password_entry, 1, 2, 2, 3, 0, 0)
  119.         vbox.pack_start (table, False, False, 0)
  120.         hbox.pack_start (vbox, False, False, 0)
  121.         d.vbox.pack_start (hbox)
  122.         self.dialog_shown = True
  123.         d.show_all ()
  124.         d.show_now ()
  125.  
  126.         if self.use_user == 'guest':
  127.             self.use_user = pwd.getpwuid (os.getuid ())[0]
  128.             debugprint ("pysmb: try as %s" % self.use_user)
  129.         username_entry.set_text (self.use_user)
  130.         domain_entry.set_text (self.use_workgroup)
  131.  
  132.         d.set_keep_above (True)
  133.         gtk.gdk.pointer_grab (d.window, True)
  134.         gtk.gdk.keyboard_grab (d.window, True)
  135.         response = d.run ()
  136.         gtk.gdk.keyboard_ungrab ()
  137.         gtk.gdk.pointer_ungrab ()
  138.  
  139.         if response == gtk.RESPONSE_CANCEL:
  140.             self.cancel = True
  141.             d.destroy ()
  142.             return -1
  143.  
  144.         self.use_user = username_entry.get_text ()
  145.         self.use_password = password_entry.get_text ()
  146.         self.use_workgroup = domain_entry.get_text ()
  147.         d.destroy ()
  148.         return 1
  149.  
  150.     def initial_authentication (self):
  151.         try:
  152.             context = smbc.Context ()
  153.             self.use_workgroup = context.workgroup
  154.         except:
  155.             pass
  156.  
  157.     def failed (self, exc=None):
  158.         self.has_failed = True
  159.         debugprint ("pysmb: operation failed: %s" % repr (exc))
  160.  
  161.         if exc:
  162.             if (self.cancel or
  163.                 (type (exc) == RuntimeError and
  164.                  not (exc.args[0] in [errno.EACCES, errno.EPERM]))):
  165.                     raise exc
  166.  
  167.     def callback (self, server, share, workgroup, user, password):
  168.         debugprint ("pysmb: got password callback")
  169.         self.auth_called = True
  170.         self.for_server = server
  171.         self.for_share = share
  172.         if self.passes == 1:
  173.             self.initial_authentication ()
  174.  
  175.         if self.use_user:
  176.             if self.use_workgroup:
  177.                 workgroup = self.use_workgroup
  178.  
  179.             return (workgroup, self.use_user, self.use_password)
  180.  
  181.         user = ''
  182.         password = ''
  183.         return (workgroup, user, password)
  184.